log-derive 0.4.1

Procedural Macros for logging the result and inputs of a function
Documentation
# Log Derive `log-derive` provides a simple attribute macro that facilitates logs as part of the [`log`] facade
Right now it contains two macros [`logfn`], [`logfn_inputs`] these macros are only for functions but still have a lot of power. # Use The basic use of these macros is by putting one or both of them on top of the function like this: `#[logfn(INFO)]`
The [`logfn`] macro is used to log the *output* of the function and [`logfn_inputs`] is used to log the *inputs*.
Please notice, the arguments being logged **must** implement the [`Debug`] trait.
(i.e. [`logfn`] requires the output to be [`Debug`] and [`logfn_inputs`] require the inputs to be [`Debug`])
The macros will accept all log levels provided by the [`log`] facade.
In [`logfn`] if the function returns a [`Result`] type the macro will accept the following additional attributes:
`(ok = "LEVEL")` and `(err = "LEVEL")` this can provide different log levels if the function failed or not.
By default the macro uses the following formatting to print the message:
[`logfn`]: `("FUNCTION_NAME() => {:?}", return_val)`
[`logfn_inputs`]: `"FUNCTION_NAME(a: {:?}, b: {:?})", a, b)`
This can be easily changed using the `fmt` attribute: `#[logfn(LEVEL, fmt = "Important Result: {:}")`
which will accept format strings similar to [`println!`]. [`logfn`]: ./attr.logfn.html [`logfn_inputs`]: ./attr.logfn_inputs.html [`log`]: https://docs.rs/log/latest/log/index.html [`Result`]: https://doc.rust-lang.org/std/result/enum.Result.html [`println!`]: https://doc.rust-lang.org/stable/std/macro.println.html [`Debug`]: https://doc.rust-lang.org/std/fmt/trait.Debug.html ## Examples ```rust use log_derive::{logfn, logfn_inputs}; # #[derive(Debug)] struct Error; # #[derive(Debug)] struct Success; # #[derive(Debug)] enum Status { Alive, Dead, Unknown } #[logfn(Warn)] #[logfn_inputs(Info, fmt = "Checking if {:?} is alive")] fn is_alive(person: &Person) -> Status { # use Response::*; # use Status::*; match person.ping() { Pong => Status::Alive, Timeout => if person.is_awake() { Unknown } else { Dead } } } #[logfn_inputs(Info)] #[logfn(ok = "TRACE", err = "ERROR")] fn call_isan(num: &str) -> Result { if num.len() >= 10 && num.len() <= 15 { Ok(Success) } else { Err(Error) } } #[logfn(INFO, fmt = "a + b = {}")] #[logfn_inputs(Trace, fmt = "adding a: {:?} and b: {:?}")] fn addition(a: usize, b: usize) -> usize { a + b } #[logfn_inputs(Info)] #[logfn(ok = "TRACE", log_ts = true)] fn time_this(num: &str) -> Result { if num.len() >= 10 && num.len() <= 15 { std::thread::sleep(Duration::from_secs(1)); Ok(Success) } else { Err(Error) } } # enum Response {Pong, Timeout} # #[derive(Debug)] # struct Person; # impl Person {fn ping(&self) -> Response {Response::Pong}fn is_awake(&self) -> bool {true}} # use std::time::Duration; ```